package rede;

import dominioDaSolucao.AtorJogador;
import br.ufsc.inf.leobr.cliente.Jogada;
import br.ufsc.inf.leobr.cliente.OuvidorProxy;
import br.ufsc.inf.leobr.cliente.Proxy;
import br.ufsc.inf.leobr.cliente.exception.ArquivoMultiplayerException;
import br.ufsc.inf.leobr.cliente.exception.JahConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoConectadoException;
import br.ufsc.inf.leobr.cliente.exception.NaoJogandoException;
import br.ufsc.inf.leobr.cliente.exception.NaoPossivelConectarException;

public class AtorNetGames implements OuvidorProxy {

	private static final long serialVersionUID = 6L;
	protected AtorJogador atorJogador;
	protected Proxy proxy;

	public AtorNetGames(AtorJogador atorJogador) {
		this.proxy = Proxy.getInstance();
		this.atorJogador = atorJogador;
		this.proxy.addOuvinte(this);
	}

	public boolean conectar(String servidor, String nome) {
		try {
			proxy.conectar(servidor, nome);
			return true;
		} catch (JahConectadoException e) {
			return true;
		} catch (NaoPossivelConectarException e) {
			e.printStackTrace();
			return false;
		} catch (ArquivoMultiplayerException e) {
			e.printStackTrace();
			return false;
		}
	}

	public String obterNomeAdversario(int posicao) {
		return proxy.obterNomeAdversario(posicao);
	}

	public boolean desconectar(boolean andamento) {
		try {
			if (andamento) {
				proxy.finalizarPartidaComErro("Um dos jogadores se desconectou do servidor.");
			} else {
				proxy.desconectar();
			}
			return true;
		} catch (NaoConectadoException e) {
			return false;
		}
	}

	public void enviarJogada(String nomeJogador, int x, int y, int tipo,
			int orientacao, int cor, int tipoDaJogada) {
  		Jogada jogada = new JogadaTetris(nomeJogador, x, y, tipo, orientacao,
				cor, tipoDaJogada);
		try {
 			proxy.enviaJogada(jogada);
		} catch (NaoJogandoException e) {
			e.printStackTrace();
		}
	}

	public boolean solicitaNovaPartida() {
		try {
 			proxy.iniciarPartida(2);
			return true;
		} catch (NaoConectadoException e) {
			return false;
		}
	}

	@Override
	public void iniciarNovaPartida(Integer posicao) {
		atorJogador.receberInicioPartida(posicao);
  	}

	@Override
	public void receberJogada(br.ufsc.inf.leobr.cliente.Jogada jogada) {
		JogadaTetris jt = (JogadaTetris) jogada;
		atorJogador.recebeJogada(jt.getNomeJogador(), jt.getX(), jt.getY(),
				jt.getTipo(), jt.getOrientacao(), jt.getCor(),
				jt.getTipoDaJogada());
	}

	@Override
	public void receberMensagem(String message) {
	}

	@Override
	public void tratarConexaoPerdida() {
		atorJogador.tratarConexaoPerdida();
		System.out.println("conexao perdida");
	}

	@Override
	public void tratarPartidaNaoIniciada(String message) {
		atorJogador.tratarPartidaNaoIniciada(message);
	}

	@Override
	public void finalizarPartidaComErro(String message) {
		try {
			proxy.desconectar();
			atorJogador.finalizarPartidaComErro(message);
		} catch (NaoConectadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}